package com.southminority.ethnic.service.alioss;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

@Slf4j
@Service
public class OssServiceImp implements OssService {

    //读取配置文件内容
    @Value("${aliyun.oss.file.endpoint:default-endpoint}")
    private String endpoint;
    @Value("${aliyun.oss.file.keyid:default-keyid}")
    private String accessKeyId;
    @Value("${aliyun.oss.file.keysecret:default-keysecret}")
    private String accessKeySecret;
    @Value("${aliyun.oss.file.bucketname:default-bucket}")
    private String bucketName;

    @Override
    public String upload(MultipartFile file,String className) {

        // 检查是否配置了真实的OSS参数
        if ("default-endpoint".equals(endpoint) || "default-keyid".equals(accessKeyId) 
            || "default-keysecret".equals(accessKeySecret) || "default-bucket".equals(bucketName)) {
            log.warn("OSS配置未正确设置，请在application.yml中配置真实的阿里云OSS参数");
            throw new RuntimeException("OSS服务未配置，请联系管理员配置阿里云OSS参数");
        }

        if (className == null || "".equals(className)) {
            className="isNullClass";
        }
        log.info("OSS上传参数: endpoint={}, bucket={}, className={}", endpoint, bucketName, className);
        try {
            // 创建OSS实例。
            OSS ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
            //获取上传文件输入流
            InputStream inputStream = file.getInputStream();
            String uuid = UUID.randomUUID().toString().replace("-", "");
            String fileType = getFileSuffix(file);
            if (fileType == null || fileType.isEmpty() ||".jsp".equals(fileType)){
                throw new RuntimeException("上传文件格式错误,格式为："+fileType);
            }

            String fileName = uuid+fileType;
            String path="gzmu_ssmz/"+className+"/"+ DateTime.now().toString("yyyy/MM/dd/");

            //调用oss方法实现上传
            //第一个参数  Bucket名称
            //第二个参数  上传到oss文件路径和文件名称   aa/bb/1.jpg
            //第三个参数  上传文件输入流
            ossClient.putObject(bucketName, path+fileName,inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();

            String url="http://"+bucketName+"."+endpoint+"/"+path+fileName;
            log.info(path);
            log.info(fileName);

            return url;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }


    }

    @Override
    public String updateFile(MultipartFile file, String url) {
        // 检查是否配置了真实的OSS参数
        if ("default-endpoint".equals(endpoint) || "default-keyid".equals(accessKeyId) 
            || "default-keysecret".equals(accessKeySecret) || "default-bucket".equals(bucketName)) {
            log.warn("OSS配置未正确设置，请在application.yml中配置真实的阿里云OSS参数");
            throw new RuntimeException("OSS服务未配置，请联系管理员配置阿里云OSS参数");
        }
        
        try {
            // 创建OSS客户端实例
            OSS ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
            //获取上传文件输入流
            InputStream inputStream = file.getInputStream();
            try {
                // 上传文件：Bucket名称 + 完整路径（Key） + 文件输入流
                ossClient.putObject(bucketName,url,inputStream);
                // 拼接文件访问URL（公开Bucket可直接访问，私有Bucket需生成签名URL）
                return url;
            }
            catch (Exception e) {
                throw new RuntimeException(e);
            }
            finally {
                // 关闭OSS客户端（重要：避免资源泄露）
                ossClient.shutdown();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public boolean testOssConfig() {
        // 检查是否配置了真实的OSS参数
        if ("default-endpoint".equals(endpoint) || "default-keyid".equals(accessKeyId) 
            || "default-keysecret".equals(accessKeySecret) || "default-bucket".equals(bucketName)) {
            log.warn("OSS配置未正确设置，当前使用默认配置");
            return false;
        }
        
        try {
            // 创建OSS实例测试连接
            OSS ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
            // 测试bucket是否存在
            boolean exists = ossClient.doesBucketExist(bucketName);
            ossClient.shutdown();
            
            if (exists) {
                log.info("OSS配置测试成功，bucket [{}] 存在", bucketName);
                return true;
            } else {
                log.warn("OSS配置测试失败，bucket [{}] 不存在", bucketName);
                return false;
            }
        } catch (Exception e) {
            log.error("OSS配置测试失败: {}", e.getMessage());
            return false;
        }
    }

    public static String getFileSuffix(MultipartFile file) {
        // 获取原始文件名
        String originalFilename = file.getOriginalFilename();
        // 文件名不存在或为空时，返回空字符串
        if (originalFilename == null || originalFilename.isEmpty()) {
            return "";
        }
        // 查找最后一个 "." 的位置
        int lastDotIndex = originalFilename.lastIndexOf(".");
        // 若没有 "." 或 "." 是最后一个字符，则没有后缀
        if (lastDotIndex == -1 || lastDotIndex == originalFilename.length() - 1) {
            return "";
        }
        // 截取从 "." 开始到最后的部分（包含 "."）
        return originalFilename.substring(lastDotIndex);
    }
}
